﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using GestionaleBolletta.data;

namespace GestionaleBolletta.logic
{
    /// <summary>
    /// Funzione che enumera di due tipi di file ai quali può accedere il programma: fornitori e bollette
    /// </summary>
    public enum XMLType
    {
        fornitore = 0,
        bolletta = 1,
    }

    /// <summary>
    /// Classe per la gestione degli xml 
    /// </summary>
    public class GestioneXML
    {

        private static int contatoreId { get; set; }
        public List<string> ListaFornitori;
        public List<Fornitore> Fornitori { get; set; }

        private static string pathBollette = "config\\listaBollette.xml";
        private static XmlDocument XMLBollette;

        public GestioneXML()
        {
            this.XmlOpen(XMLType.bolletta);
            this.XmlOpen(XMLType.fornitore);
            ListaFornitori = this.GetListFornitori();
            GetListBollette();
        }

        public void insertNewBollettaXml(Bolletta bolletta)
        {
            XmlNodeList posizioneInserimento = XMLBollette.GetElementsByTagName(bolletta.fornitore);

            XmlElement elem = XMLBollette.CreateElement("bolletta");
            elem.SetAttribute("Id", (contatoreId + 1).ToString());
            elem.SetAttribute("DataScadenza", bolletta.dataScadenza.ToShortDateString());
            //elem.SetAttribute("DataPagamento", bolletta.dataPagamento.ToShortDateString());
            elem.SetAttribute("Descrizione", bolletta.descrizione);
            //elem.SetAttribute("Immagine", bolletta.immagine);
            posizioneInserimento.Item(0).AppendChild(elem);

            XMLBollette.Save(pathBollette);
        }


        /// <summary>
        /// Funzione per l'apertura di un file xml
        /// </summary>
        /// <param name="type"></param>
        private void XmlOpen(XMLType type)
        {
            try
            {
                if (XMLBollette == null)
                {
                    XMLBollette = new XmlDocument();
                    XMLBollette.Load(pathBollette);
                }
            }
            catch (Exception e)
            {

            }

        }

        /// <summary>
        /// Funzione per l'inserimento di un nuovo fornitore nell'elenco fornitori
        /// </summary>
        /// <param name="nome"></param>
        public void InsertNewFornitore(string nome)
        {
            List<string> elencoFornitori = GetListFornitori();
            try
            {
                if (!elencoFornitori.Exists(x => x.ToUpper() == nome.ToUpper()))
                {
                    XmlElement elem = XMLBollette.CreateElement(nome);
                    //elem.SetAttribute("nome", nome);
                    //elem.SetAttribute("path", "data\\" + nome);
                    XMLBollette.DocumentElement.AppendChild(elem);
                    XMLBollette.Save(pathBollette);

                    ListaFornitori = this.GetListFornitori();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// Funzione che controlla se un elemento fornitore esiste già
        /// </summary>
        /// <param name="nomeFornitore"></param>
        /// <returns></returns>
        private bool CheckFornitoreExistence(string nomeFornitore)
        {
            List<string> elencoFornitori = GetListFornitori();

            if (!elencoFornitori.Exists(x => x.ToUpper() == nomeFornitore.ToUpper()))
            {
                return false;
            }
            else
            {
                return true;
            }
        }

        /// <summary>
        /// Funzione che restituisce l'elenco dei fornitori
        /// </summary>
        /// <returns></returns>
        private List<string> GetListFornitori()
        {

            var nodoFornitori = XMLBollette.GetElementsByTagName("bollette");

            List<string> nomeFornitore = new List<string>();

            foreach (XmlNode item in nodoFornitori)
            {
                XmlNodeList elenco = item.ChildNodes;
                foreach (XmlNode item2 in elenco)
                {
                    var a = item2.Name;
                    nomeFornitore.Add(a);
                }
            }

            return nomeFornitore;
        }

        /// <summary>
        /// Funzione che prendere l'elenco delle bollette
        /// </summary>
        private void GetListBollette()
        {
            contatoreId = 0;

            //istanza di un oggetto fornitore per far si che ogni volta venga svuotata la lista dei fornitori
            Fornitori = new List<Fornitore>();

            // prendo tutti i nodi <bollette> nell'xml delle bollette per avere l'elenco dei figli
            XmlNodeList nodoBolletteFornitori = XMLBollette.GetElementsByTagName("bollette");

            List<string> elencoBollette = new List<string>();

            foreach (XmlNode item in nodoBolletteFornitori)
            {

                foreach (XmlNode ciclofornitori in item.ChildNodes)
                {
                    Fornitore fornitore = new Fornitore();
                    fornitore.Nome = ciclofornitori.Name;

                    fornitore.ElencoBollette = new List<Bolletta>();

                    foreach (XmlNode bollettaFornitore in ciclofornitori)
                    {
                        Bolletta bolletta = new Bolletta();
                        bolletta.id = Convert.ToInt32(bollettaFornitore.Attributes["Id"].Value);
                        bolletta.descrizione = bollettaFornitore.Attributes["Descrizione"].Value;
                        bolletta.dataScadenza = Convert.ToDateTime(bollettaFornitore.Attributes["DataScadenza"].Value);
                        if (bollettaFornitore.Attributes["DataPagamento"] != null)
                            bolletta.dataPagamento = Convert.ToDateTime(bollettaFornitore.Attributes["DataPagamento"].Value);
                        if (bollettaFornitore.Attributes["Immagine"] != null)
                            bolletta.immagine = bollettaFornitore.Attributes["Immagine"].Value;
                        contatoreId++;
                        fornitore.ElencoBollette.Add(bolletta);
                    }
                    Fornitori.Add(fornitore);
                }
            }
        }

        public void UpdateBollettaXml(int idPagamento, DateTime dataPagamento)
        {
            // prendo tutti i nodi <bollette> nell'xml delle bollette per avere l'elenco dei figli
            XmlNodeList nodoBolletteFornitori = XMLBollette.GetElementsByTagName("bollette");

            foreach (XmlNode item in nodoBolletteFornitori)
            {
                foreach (XmlNode ciclofornitori in item.ChildNodes)
                {
                    foreach (XmlNode bollettaFornitore in ciclofornitori)
                    {
                        if (Convert.ToInt32(bollettaFornitore.Attributes["Id"].Value) == idPagamento)
                        {
                            XmlAttribute nuovoAttributoXml = XMLBollette.CreateAttribute("DataPagamento");
                            nuovoAttributoXml.Value = dataPagamento.ToShortDateString();
                            bollettaFornitore.Attributes.Append(nuovoAttributoXml);
                        }
                    }
                }
            }
            XMLBollette.Save(pathBollette);
            GetListBollette();
        }

    }

}
